package edu.uoc.tds.pec4.gestor.impl;

//import edu.uoc.tds.pec4.gestor.SS2_GestorEvento;
import edu.uoc.tds.pec4.model.SS1_TipoRol;
import edu.uoc.tds.pec4.model.SS2_Evento;
import java.io.Serializable;
import java.rmi.RemoteException;
import edu.uoc.tds.pec4.gestor.*;
import edu.uoc.tds.pec4.model.SS1_CentroDocente;
import edu.uoc.tds.pec4.model.SS1_Usuario;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 * Implementación del Gestor de Eventos
 * @author Grupo Magicsoftware - Yolanda Jiménez Anaya
 * @version 1.0
 *
 */
public class GestorEventoImpl extends GestorDiscoImpl
        implements GestorEvento, Serializable{

    private static final long serialVersionUID = 1L;
    private Connection conexion;
    private final DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    public GestorEventoImpl() throws RemoteException{
        super();
    }

    /*Se obtienen los datos de un evento determinado*/

    public SS2_Evento leeEvento(long idEvento) throws RemoteException {
         SS2_Evento evento= null;
         ResultSet rs = null;
         try {
            conectaBD();
            String v_Tabla = "evento";
            String v_Condicion = "cod_evento = " + idEvento;
            String v_Campos = "cod_centrodocente,nombre,descripcion,fecha_alta,fecha_celebracion,activo"
              + ",fecha_actividad,motivo_estado,cod_tipoevento,capacidad"
              + ",fechaInicioInscripcion,fechafininscripcion,duracion,precio"
              + ",plazas,umbral, creditos" ;
            
            rs = select(v_Tabla, v_Condicion, v_Campos);
           while (rs.next()) {
            evento = new SS2_Evento(
                                rs.getInt("cod_centrodocente"),
                                rs.getString("nombre"),
                                rs.getString("descripcion"),
                                (Date) rs.getDate("fecha_alta"),
                                (Date) rs.getDate("fecha_celebracion"),
                                rs.getString("activo"),
                                (Date) rs.getDate("fecha_actividad"),
                                rs.getString("motivo_estado"),
                                rs.getInt("cod_tipoevento"),
                                rs.getInt("capacidad"),
                                (Date) rs.getDate("fechaInicioInscripcion"),
                                (Date) rs.getDate("fechafininscripcion"),
                                rs.getString("duracion"),
                                rs.getInt("precio"),
                                rs.getInt("plazas"),
                                rs.getInt("umbral"),
                                rs.getInt("creditos") );
             }
        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
        } catch (Exception ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
        } finally {
            try {
                desconectaBD();
            } catch (Exception e) {
            }
        }
        return evento;
        //throw new UnsupportedOperationException("Not supported yet.");
        /*SS2_Evento evento= null;
        Statement st = null;
 	ResultSet rs = null;

 	try {
            conectaBD();
            st = conexion.createStatement
                    (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            String query = "SELECT * FROM EVENTO WHERE id_evento = "
                    + idEvento;

            rs = st.executeQuery(query);
            rs.next();

            evento = new SS2_Evento(
                                rs.getInt("cod_centrodocente"),
                                rs.getString("nombre"),
                                rs.getString("descripcion"),
                                (Date) rs.getDate("fecha_alta"),
                                (Date) rs.getDate("fecha_celebracion"),
                                rs.getString("activo"),
                                (Date) rs.getDate("fecha_actividad"),
                                rs.getString("motivo_estado"),
                                rs.getInt("cod_tipoevento"),
                                rs.getInt("capacidad"),
                                (Date) rs.getDate("fechaInicioInscripcion"),
                                (Date) rs.getDate("fechaFinIncripcion"),
                                rs.getString("duracion"),
                                rs.getInt("precio"),
                                rs.getInt("plazas"),
                                rs.getInt("umbral"),
                                rs.getInt("creditos") );
           evento = new SS2_Evento();

 	} catch (SQLException e) {
            ExceptionUtils.visualizarError(ExceptionUtils.Err_leeEvento);

 	} finally {
            try {
                rs.close();
                st.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(ExceptionUtils.Err_BD);
            }
 	}
        return evento;*/
    }

    /*Se inserta en la base de datos un evento nuevo*/
    public boolean registraEvento(SS2_Evento evento) throws RemoteException {

       boolean result = true;
 	try {
            conectaBD();
                 String query = " INSERT INTO EVENTO VALUES (default,"
                       + evento.getCodCentro() + ","
                       + "'"+evento.getNombre()+"'"+ ","
                       + "'"+evento.getdescripcion()+"'"+ ","
                       + "'"+new Date(evento.getfechaAlta().getTime())+"'"+ ","
                       + "'"+new Date(evento.getfechaCelebracion().getTime())+"'"+ ","
                       + evento.getActivo()+ ","
                       + "'"+new Date(evento.getfechaActividad().getTime())+"'"+ ","
                       + "'"+evento.getMotivoEstado()+"'"+ ","
                       + evento.gettipoEvento()+ ","
                       + evento.getcapacidad()+ ","
                       + "'"+new Date(evento.getfechaInicioInscripcion().getTime())+"'"+ ","
                       + "'"+new Date(evento.getfechaFinIncripcion().getTime())+"'"+ ","
                       + "'"+evento.getduracion()+"'"+ ","
                       + evento.getprecio() + ","
                       + evento.getPlazas()+ ","
                       + evento.getUmbral()+ ","
                       + evento.getCreditos() + ")";
            
                 

            result = insertQuery(query);
            desconectaBD();

 	} catch (SQLException ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
        } catch (Exception ex) {
            Logger.getLogger(GestorEventoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return result;
    }

    /*Se modifica los datos de un Evento determinado*/
    public boolean modificaEvento(SS2_Evento evento, String idEvento) throws RemoteException {
        // PreparedStatement st = null;
        boolean result = true;
 	try {
            conectaBD();
            String query = "UPDATE EVENTO SET "
                       + " cod_centrodocente = " + evento.getCodCentro()
                       + ", nombre = '" + evento.getNombre() +"'"
                       + ", descripcion = '"+evento.getdescripcion() +"',"
                       + " fecha_celebracion = to_date('" + sdf.format(evento.getfechaCelebracion())+ "','dd/mm/yyyy'),"                       
                       + " activo = '" + evento.getActivo() + "',"
                       + " fecha_actividad = to_date('" +sdf.format(evento.getfechaActividad())+"','dd/mm/yyyy'), "
                       + " motivo_estado = '" + evento.getMotivoEstado() + "',"
                       + " cod_tipoevento = " +evento.gettipoEvento()
                       + " ,plazas = " +evento.getPlazas()+", umbral = " + evento.getUmbral() + ","
                       + " fechainicioinscripcion = to_date('" + sdf.format(evento.getfechaInicioInscripcion()) +"','dd/mm/yyyy'),"
                       + " fechafininscripcion = to_date('" + sdf.format(evento.getfechaFinIncripcion()) +"','dd/mm/yyyy'), "
                       + " duracion = " + evento.getduracion() + ","
                       + " creditos = " + evento.getCreditos() + ","
                       + " precio = " + evento.getprecio()
                       + "  where cod_evento = " + idEvento;

            System.out.print(query);
            result = insertQuery(query);
            desconectaBD();
           
 	} catch (SQLException ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
        } catch (Exception ex) {
            Logger.getLogger(GestorEventoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return result;
    }

    /*Se borra un evento determinado por su idetenficador*/
    public void borraEvento(long idEvento) throws RemoteException {
        PreparedStatement st = null;

 	try {
            String query = "DELETE FROM EVENTO WHERE id_evento = "
                       + idEvento;

            st = conexion.prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

            st.execute();

 	} catch (SQLException e) {
           ExceptionUtils.visualizarError(ExceptionUtils.Err_borraEvento);

 	} finally {
            try {
                if (st != null) {
                    st.close();
                }
            } catch (Exception e) {
                ExceptionUtils.visualizarError(ExceptionUtils.Err_BD);
            }
        }
    }

    public ArrayList<SS2_Evento> getEventos(Date fechaCelebracion) throws RemoteException {
        ArrayList<SS2_Evento> lista = new ArrayList<SS2_Evento>();
        Statement st = null;
 	ResultSet rs = null;

 	try {
            st = conexion.createStatement
                    (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            String query = "SELECT * FROM EVENTOS WHERE fecha_Celebracion < "
                     + fechaCelebracion;

            rs = st.executeQuery(query);
            while (rs.next()) {
                /*SS2_Evento evento = new SS2_Evento
                        (rs.getInt("idEvento"), rs.getString("descripcion"));*/
                SS2_Evento evento = new SS2_Evento();
                lista.add(evento);
            }

 	} catch (SQLException e) {
            ExceptionUtils.visualizarError(ExceptionUtils.Err_getEventos);

 	} finally {
            try {
                rs.close();
                st.close();

            } catch (Exception e) {
                 ExceptionUtils.visualizarError(ExceptionUtils.Err_BD);
            }
 	}
 	return lista;
    }

    public ArrayList<SS1_TipoRol> getRoles() throws RemoteException {
         ArrayList<SS1_TipoRol> lista = new ArrayList<SS1_TipoRol>();
        Statement st = null;
 	ResultSet rs = null;

 	try {
            st = conexion.createStatement
                    (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            String query = "SELECT * FROM TIPOROL  ";

            rs = st.executeQuery(query);
            while (rs.next()) {
//                SS1_TipoRol TipoRol = new SS1_TipoRol
//                        (rs.getInt("id_rol"), rs.getString("descripcion"));
//                lista.add(TipoRol);
            }

 	} catch (SQLException e) {
            ExceptionUtils.visualizarError(ExceptionUtils.Err_getEventos);

 	} finally {
            try {
                rs.close();
                st.close();

            } catch (Exception e) {
                 ExceptionUtils.visualizarError(ExceptionUtils.Err_BD);
            }
 	}
 	return lista;
    }


    public List<SS1_CentroDocente> dameListaCentros() throws RemoteException, Exception {
        List<SS1_CentroDocente> llista = new ArrayList<SS1_CentroDocente>();
        ResultSet rs = null;
        try {
            conectaBD();
            rs = selectQuery("SELECT cod_centrodocente, nombre FROM centrodocente");
            while (rs.next()) {
                
                SS1_CentroDocente sS1_CentroDocente = new SS1_CentroDocente();
                sS1_CentroDocente.setId(rs.getInt("cod_centrodocente"));
                sS1_CentroDocente.setNombre(rs.getString("nombre"));
                llista.add(sS1_CentroDocente);
            }
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } finally {
            try {
                rs.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(e.getMessage());
            }
        }
        return llista;
    }

        public List<SS1_CentroDocente> dameListaTipo() throws RemoteException, Exception {
        List<SS1_CentroDocente> llista = new ArrayList<SS1_CentroDocente>();
        ResultSet rs = null;
        try {
            conectaBD();
            rs = selectQuery("SELECT * FROM tipoevento");
            while (rs.next()) {
                
                SS1_CentroDocente sS1_CentroDocente = new SS1_CentroDocente();
                sS1_CentroDocente.setNombre(rs.getString("titulo"));
                sS1_CentroDocente.setId(rs.getInt("cod_tipoevento"));
                llista.add(sS1_CentroDocente);
            }
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } finally {
            try {
                rs.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(e.getMessage());
            }
        }
        return llista;
    }

            /**
     * Metodo que consulta los eventos disponibles en la aplicacion, filtrando por tipo evento
     * @param p_TipoEvento: Parametro de tipo evento
     * @return Lista de objetos evento
     */
    public List<SS2_Evento> getListaEvento(String p_centro, String FechaDesde,
                                           String FechaHasta) {
        List<SS2_Evento> lista = new ArrayList<SS2_Evento>();
        ResultSet rs = null;
        try {

            
            conectaBD();
            String v_Tabla = "evento ";
            String v_Condicion = "";
            if (!p_centro.equals("0")) {
                v_Condicion = " cod_centrodocente=" + p_centro
                             + "and activo = '1' "
                             + "and (fecha_celebracion >= TO_DATE('" + FechaDesde
                             + "','dd/mm/yyyy') and fecha_celebracion <= TO_DATE('"
                             + FechaHasta + "','dd/mm/yyyy')) ORDER BY cod_evento" ;
                
            }
            String v_Campos = "fecha_celebracion,cod_evento, nombre,cod_centrodocente,duracion";
            rs = select(v_Tabla, v_Condicion, v_Campos);
            
            while (rs.next()) {
                SS2_Evento evento = new SS2_Evento();
                evento.setfechaCelebracion(rs.getDate("fecha_celebracion"));
                evento.setNombre(rs.getString("nombre"));
                evento.setidEvento(rs.getInt("cod_evento"));
                evento.setCodCentro(rs.getInt("cod_centrodocente"));
                evento.setduracion(rs.getString("duracion"));
                lista.add(evento);
            }

        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
            lista = null;
        } catch (Exception ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
            lista = null;
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                desconectaBD();
            } catch (Exception e) {
            }
        }
        return lista;
    }

    public boolean CancelarEventos(List<SS2_Evento> lista) throws RemoteException, Exception {

        try {
            conectaBD();
            String v_Tabla = "evento";
            String v_Condicion = "";
            String v_Campos = "";

            for (int i = 0; i < lista.size(); i++) {

                SS2_Evento cancelar = lista.get(i);
                v_Campos = "activo='0' " + ", motivo_estado='Cancelado' "; 
                v_Condicion = "cod_evento=" + cancelar.getidEvento() +
                             " and cod_centrodocente=" + cancelar.getCodCentro() +
                             " and nombre = '" + cancelar.getNombre()+"'" ;
                update(v_Tabla, v_Condicion, v_Campos);
            }

        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
            return false;
        } catch (Exception ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
            return false;
        } finally {
            try {
                desconectaBD();
            } catch (Exception e) {
            }
        }
        return true;
    }



    	 public List<SS1_Usuario> getListaAsistentes(List<SS2_Evento> lista) throws RemoteException, Exception{

         List<SS1_Usuario> listaUsu = new ArrayList<SS1_Usuario>();
         ResultSet rs = null;


         try {
            conectaBD();
            String v_Tabla = " usuario,evento,inscripcion ";
            String v_Condicion = "";
            String v_Campos = " usuario.cod_usuario,usuario.nombre,usuario.apellido1,usuario.apellido2 ";

            for (int i = 0; i < lista.size(); i++) {

                SS2_Evento evento = lista.get(i);

                evento.getfechaCelebracion();
                v_Condicion = " inscripcion.cod_evento=" + evento.getidEvento()
                             + " and inscripcion.fecha = TO_DATE('" + sdf.format(evento.getfechaCelebracion())
                             + "','dd/mm/yyyy') and "
                             + " inscripcion.cod_evento = evento.cod_evento "
                             + " and usuario.cod_usuario = inscripcion.cod_usuario ORDER BY evento.cod_evento" ;

                
                rs = select(v_Tabla, v_Condicion, v_Campos);
                while (rs.next()) {
                SS1_Usuario usuario = new SS1_Usuario();

                usuario.setId(rs.getInt("cod_usuario"));
                usuario.setNombre(rs.getString("nombre"));
                usuario.setApellido1(rs.getString("apellido1"));
                usuario.setApellido2(rs.getString("apellido2"));
                listaUsu.add(usuario);
            }
            }

        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
        } catch (Exception ex) {
            ExceptionUtils.visualizarError(ex.getMessage());
        } finally {
            try {
                desconectaBD();
            } catch (Exception e) {
            }
        }
        return listaUsu;
     }
}
